package cn.tedu.apiday06;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class HashMapAction {//测试HashMap

    public static void main(String[] args) {
        //创建对象----底层构建一个桶，初始化容量是16，加载因子（容量上限）是0.75
        HashMap <Integer ,String> h = new HashMap<>();
        //常用方法
        //原理，当确定元素想要存入h集合中时，底层开始利用hashCode()计算出数据一个存放位置的哈希值
        //HashMap底层维护了数组和链表的结构，当你存放数据时，拿着哈希值去节点上存放元素
        //但是会有两个情况发生，该数组节点的位置根本没有存过元素，会把数据直接放入数组节点上，便于后续的查询
        //如果该数组的节点位置，已经存放过数据了(hash碰撞/hash冲突)，就会形成链表形式，导致降低了查询效率
        //但是在jak1.8版本后，优化了链表结构，当链表的节点长度>=8时,会自动转成红黑树，来提高查询效率
        //间hashmap源代码第624行
        h.put(1,"孙");
        h.put(2,"符");
        h.put(3,"刘");
        //特点 数据无序 默认一开始是null 加了数据才赋值
        System.out.println(h);
        //h.clear();//从此映射中移除所有映射关系。
        System.out.println(h.containsKey(1314));//判断h中是否包含指定的key
        System.out.println(h.containsValue(""));//判断h中是否包含指定的value
        System.out.println(h.equals("jack"));//判断h是否和指定的元素相等
        System.out.println(h.get(1));//根据指定的key获取对应的value
        System.out.println(h.hashCode());//获取h的哈希码值
        System.out.println(h.isEmpty());//判断h是否为空
        System.out.println(h.remove(3));//根据指定的key删除记录，并返回删除的value
        System.out.println(h.size());//获取h里元素的个数
        Collection<String> c = h.values();//把h里的所有value们，放入Collection中
        for (String value: c) {
            System.out.println("value="+value);
        }
        //迭代map----map本身来讲，并没有直接的迭代的方式，只能间接的把map里的数据放入set里，然后遍历set
        //第一种遍历方式：Set<K>KeySet()------就是把h里的所有key们放入set中
        Set<Integer> set = h.keySet();
        for (Integer key:set
        ) {//遍历set  拿到每个key
            String value = h.get(key);//获取key对应的value
            System.out.println(key+"+"+value);
        }
        //Set<Map.Entry<K,V>> entrySet()------是把h里的一条数据包括key和value整体存到set里，并封装成Entry对象
        Set <Map.Entry<Integer,String>> set1 = h.entrySet();
        for (Map.Entry<Integer,String> entry:set1
        ) {//遍历 set ，拿到每个Entry
            Integer key = entry.getKey();//获取Entry存着的Key
            String value = entry.getValue();//获取Entry存着的Value
            System.out.println(key+"==="+value);
        }

    }
}
